home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 12 - 1996 / 12.03 Mar 96 / SlidingTiles ƒ / Main.c next >
Encoding:
C/C++ Source or Header  |  1996-01-15  |  4.9 KB  |  233 lines  |  [TEXT/CWIE]

  1. /* 
  2.   Test code for the SlidingTiles Programmer's Challenge
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. #include "Main.h"
  9. #include "TileMain.h"
  10. #include "Solve.h"
  11.  
  12. /* NOTE:  kMaxSize may be larger in the actual test data */
  13. #define kMaxSize 33L
  14.  
  15. #define kMaxShort 0xffff
  16.  
  17. static Boolean gDone = false;
  18. static WindowPtr gWind;
  19.  
  20. /*
  21.    Initialize Toolbox, menu bar, and animation window.
  22. */
  23. static void Init()
  24. {
  25.   Handle mbar;
  26.  
  27.   InitGraf(&qd.thePort);
  28.   InitFonts();
  29.   InitWindows();
  30.   InitMenus();
  31.   TEInit();
  32.   InitDialogs(nil);
  33.   InitCursor();
  34.   
  35.   mbar = GetNewMBar(kMBarID);
  36.   SetMenuBar(mbar);
  37.   AppendResMenu(GetMenuHandle(kAppleMenu), 'DRVR');
  38.   DrawMenuBar();
  39.   
  40.   gWind = GetNewWindow(kTilesWindow,nil,(WindowPtr)-1);
  41.   SetPort(gWind);
  42.   TextFont(geneva);
  43.   TextSize(9);
  44. }
  45.  
  46. /*
  47.    Execute a menu command.
  48. */
  49. static OSErr DoCommand (long mResult, short modifiers)
  50. {
  51.   GrafPtr savePort;
  52.   WindowPtr wind;
  53.   DialogPtr dlg;
  54.   OSErr err = noErr;
  55.   Handle iHandle;
  56.   Rect iRect;
  57.   Str255 daName,textStr;
  58.   long rows,cols,cases;
  59.   short menu, item, itemHit, iType;
  60.  
  61.   menu = HiWord(mResult);
  62.   item = LoWord(mResult);
  63.   wind = FrontWindow();
  64.  
  65.   switch (menu) {
  66.   
  67.     case kAppleMenu:
  68.       switch (item) {
  69.         default:
  70.           GetPort(&savePort);
  71.           SetCursor(&qd.arrow);
  72.           GetMenuItemText(GetMenuHandle(kAppleMenu), item, daName);
  73.           OpenDeskAcc(daName);
  74.           SetPort(savePort);
  75.           break;
  76.       }
  77.       break;
  78.       
  79.     case kFileMenu:
  80.       switch (item) {
  81.         case kQuitItem:
  82.           gDone = true;
  83.           break;
  84.       }
  85.       break;
  86.       
  87.     case kTestCaseMenu:
  88.       switch (item) {
  89.         case kNewProblemItem:
  90.           GetPort(&savePort);
  91.           dlg = GetNewDialog(kNewProblemDlg,nil,(WindowPtr)-1);
  92.           SetPort(dlg);
  93.           GetDItem(dlg,kNumCols,&iType,&iHandle,&iRect);
  94.           SelIText(dlg,kNumCols,0,0xffff);
  95.           do {
  96.             ModalDialog(nil,&itemHit);
  97.           } while (cancel<itemHit);
  98.           if (ok == itemHit) {
  99.             GetDItem(dlg,kNumRows,&iType,&iHandle,&iRect);
  100.             GetIText(iHandle,textStr);
  101.             StringToNum(textStr,&rows);
  102.             GetDItem(dlg,kNumCols,&iType,&iHandle,&iRect);
  103.             GetIText(iHandle,textStr);
  104.             StringToNum(textStr,&cols);
  105.           }
  106.           SetPort(savePort);
  107.           HideWindow(dlg);
  108.           DisposeDialog(dlg);
  109.           if (ok == itemHit) {
  110.             if ((rows>1) && (rows<=kMaxSize) &&
  111.               (cols>1) && (cols<=kMaxSize))
  112.               RunOneCase(gWind,rows,cols);
  113.           }
  114.           break;
  115.         case kRunSeveralItem:
  116.           GetPort(&savePort);
  117.           dlg = GetNewDialog(kRunSeveralDlg,nil,(WindowPtr)-1);
  118.           SetPort(dlg);
  119.           GetDItem(dlg,kNumToRun,&iType,&iHandle,&iRect);
  120.           SelIText(dlg,kNumToRun,0,0xffff);
  121.           do {
  122.             ModalDialog(nil,&itemHit);
  123.           } while (cancel<itemHit);
  124.           if (ok == itemHit) {
  125.             GetDItem(dlg,kNumToRun,&iType,&iHandle,&iRect);
  126.             GetIText(iHandle,textStr);
  127.             StringToNum(textStr,&cases);
  128.           }
  129.           SetPort(savePort);
  130.           HideWindow(dlg);
  131.           DisposeDialog(dlg);
  132.           if (ok == itemHit) while (0 < cases--) {
  133.             rows = 2 + ((unsigned long)Random()&kMaxShort)*(kMaxSize-2)/kMaxShort;
  134.             cols = 2 + ((unsigned long)Random()&kMaxShort)*(kMaxSize-2)/kMaxShort;
  135.             RunOneCase(gWind,rows,cols);
  136.           }
  137.           break;
  138.       }
  139.       break;
  140.       
  141.    }
  142.    
  143.   HiliteMenu(0);
  144.   
  145.   return err;
  146. }
  147.  
  148. /*
  149.    Handle a key down event
  150. */
  151. static OSErr HandleKey (EventRecord *ev)
  152. {
  153.   unsigned char theChar;
  154.   short modifiers;
  155.   long menuCmd;
  156.   
  157.   theChar = ev->message & charCodeMask;
  158.   modifiers = ev->modifiers;
  159.  
  160.   if ((modifiers & cmdKey) != 0) {
  161.     menuCmd = MenuKey(theChar);
  162.     if (HiWord(menuCmd) != 0) return DoCommand(menuCmd, modifiers);
  163.   } 
  164.   return noErr;
  165. }
  166.  
  167. /*
  168.    Handle a mouse down event
  169. */
  170. static OSErr HandleMouseDown (EventRecord *ev)
  171. {
  172.   WindowPtr front, wind;
  173.   Point where;
  174.   OSErr err = noErr;
  175.   short modifiers,part;
  176.  
  177.   front = FrontWindow();
  178.   part = FindWindow(ev->where, &wind);
  179.   where = ev->where;
  180.   modifiers = ev->modifiers;
  181.   
  182.   switch (part) {
  183.   
  184.     case inMenuBar:
  185.       err = DoCommand(MenuSelect(where), modifiers);
  186.       break;
  187.       
  188.     case inSysWindow:
  189.       SystemClick(ev, wind);
  190.       break;
  191.   }
  192.   
  193.   return err;
  194.   
  195. }
  196.  
  197. /*
  198.    Event loop code
  199. */
  200. static void MainEvent()
  201. {
  202.   EventRecord ev;
  203.   OSErr err = noErr;
  204.   Boolean gotEvt;
  205.  
  206.   while (!gDone) {
  207.     gotEvt = WaitNextEvent(everyEvent, &ev, 0, nil);
  208.  
  209.     if (gotEvt) switch (ev.what) {
  210.       case activateEvt:
  211.         break;
  212.       case updateEvt:
  213.         DoUpdate((WindowPtr)ev.message);
  214.         break;
  215.       case mouseDown:
  216.         err = HandleMouseDown(&ev);
  217.         break;
  218.       case keyDown:
  219.       case autoKey:
  220.         err = HandleKey(&ev);
  221.         break;
  222.     }
  223.   }
  224. }
  225.  
  226. void main(void)
  227. {
  228.   Init();
  229.   MaxApplZone();
  230.   MainEvent();
  231. }
  232.  
  233.